SPI(Serial Peripheral Interface)是一種常見的串列通訊協議,用於在MCU和外部設備之間進行高速數據傳輸。SPI通訊通常用於連接MCU與各種外部設備,如感測器、螢幕、儲存裝置、無線模組等。
SPI通訊是一種同步通訊協議,它基於主從(Master-Slave)架構。以下是SPI通訊的基本原理:
**主機(Master):**MCU當主機,生成時鐘訊號並控制數據傳輸。
**從機(Slave):**外部設備(如感測器或儲存裝置)當從機,按照主機的時鐘訊號進行數據傳輸。
SPI通訊廣泛應用於各種嵌入式系統中,其中一些常見的用途包括:
感測器: 連接各種類型的傳感器,如溫度、壓力、陀螺儀等,以獲取數據。
儲存裝置: 用於與儲存裝置(如SD卡)進行通訊,以讀取或寫入數據。
螢幕: 控制OLED螢幕、TFT液晶螢幕等以顯示圖片影像。
通訊模組: 連接無線通訊模組,如Wi-Fi模組、LoRa模組等,以進行通訊。
嵌入式控制: 用於與其他MCU或外部控制器進行通訊,以協調不同部分的工作。
以下是一個基於Arduino的簡單SPI通訊範例程式。
#include <SPI.h>
void setup() {
Serial.begin(9600);
SPI.begin(); // 初始化SPI通訊
}
void loop() {
byte dataToSend = 5; // 要發送的數據
byte receivedData;
digitalWrite(SS, LOW); // 啟用SPI通訊
receivedData = SPI.transfer(dataToSend); // 傳送數據並接收回傳數據
digitalWrite(SS, HIGH); // 停用SPI通訊
Serial.print("Sent: ");
Serial.print(dataToSend);
Serial.print(" | Received: ");
Serial.println(receivedData);
delay(1000); // 延遲1秒
}
#include <SPI.h>
void setup() {
SPI.begin(); // 初始化SPI通訊
pinMode(SS, OUTPUT);
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE0);
SPI.setClockDivider(SPI_CLOCK_DIV4); // 設定SPI時鐘分頻
SPI.attachInterrupt(); // 啟用SPI中斷
Serial.begin(9600);
}
byte receivedData;
void loop() {
if (receivedData == 0) {
receivedData = SPI.transfer(0); // 接收主機發送的數據
receivedData = receivedData * receivedData; // 計算平方值
SPI.transfer(receivedData); // 將計算結果回傳主機
}
}